package com.atmk.atmk.designMode.创建型.单例模式.懒汉式;


import java.io.IOException;
import java.util.stream.IntStream;

//线程安全，同步代码块（不推荐）
/*
    1) 这种方式，本意是想对第四种实现方式的改进，因为前面同步方法效率太低，
    改为同步产生实例化的的代码块
    2) 但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一
    致，假如一个线程进入了if (singleton == null)判断语句块，还未来得及往下执行，
    另一个线程也通过了这个判断语句，这时便会产生多个实例
    3) 结论：在实际开发中，不能使用这种方式
*/
public class Singleton5 {
    private static Singleton5 singleton;

    private Singleton5() {
    }

    public static Singleton5 getInstance() {
        if (singleton == null) {
            synchronized (Singleton5.class) {
                singleton = new Singleton5();
            }
        }
        return singleton;

    }

    public static void main(String[] args) throws IOException {
        IntStream.range(1, 500)
                .forEach(i -> {
                    new Thread(() -> {
                        System.out.println(Singleton4.getInstance().hashCode());
                    }).start();
                });
        // 获取 Runtime 对象
        Runtime runtime = Runtime.getRuntime();
        // 执行外部命令
        try {
            // 指定本地软件的路径
            String pathToApp = "D:\\sofeware\\qqMusic\\QQMusic.exe"; // 例如，这里是打开记事本

            // 使用 Runtime.exec() 打开本地应用程序
            Process proc = Runtime.getRuntime().exec(pathToApp);

            // 等待命令执行完毕
            proc.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

        // 获取系统内存信息
        long freeMemory = runtime.freeMemory();
        long totalMemory = runtime.totalMemory();
        int availableProcessors = runtime.availableProcessors();
        System.out.println(freeMemory/1024/1024+"--"+totalMemory/1024/1024+"--"+availableProcessors);
    }
}
